﻿using System;
using Engine;
using Game;
using GameEntitySystem;
using TemplatesDatabase;

namespace HYKJ
{
    public class ComponentWaterDrinking : Component, IUpdateable
    {
        /// <summary>
        /// 玩家当前饮水值
        /// 通过属性控制值范围在0-1之间
        /// </summary>
        public float Water
        {
            get
            {
                return this.m_water;
            }
            set
            {
                this.m_water = MathUtils.Saturate(value);
            }
        }

        /// <summary>
        /// 更新顺序
        /// </summary>
        public UpdateOrder UpdateOrder
        {
            get
            {
                return 0;
            }
        }

        /// <summary>
        /// 每帧更新逻辑
        /// 处理饮水值变化、界面交互及状态判断
        /// </summary>
        /// <param name="dt">帧间隔时间</param>
        public void Update(float dt)
        {
            // 仅当玩家生命值大于0时执行逻辑（排除死亡状态）
            if (this.m_componentPlayer.ComponentHealth.Health > 0f)
            {
                this.UpdateWater(); // 更新饮水值（自然消耗等）
            }
        }

        /// <summary>
        /// 加载组件数据（从存档或初始化时）
        /// </summary>
        /// <param name="valuesDictionary">存储数据的字典</param>
        /// <param name="idToEntityMap">实体ID映射表</param>
        public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
        {
            this.m_subsystemGameInfo = Project.FindSubsystem<SubsystemGameInfo>(true);
            this.m_subsystemTime = Project.FindSubsystem<SubsystemTime>(true);
            this.m_componentPlayer = Entity.FindComponent<ComponentPlayer>(true);
            this.m_subsystemAudio = Project.FindSubsystem<SubsystemAudio>(true);
            this.m_componentCreature = Entity.FindComponent<ComponentCreature>(true);
            this.m_componentVitalStats = Entity.FindComponent<ComponentVitalStats>(true);
            // 加载饮水值
            this.Water = valuesDictionary.GetValue<float>("Water");
            // 记录上一帧的饮水值（用于状态变化判断）
            this.m_lastWater = this.Water;
        }

        /// <summary>
        /// 保存组件数据（存档时）
        /// </summary>
        /// <param name="valuesDictionary">存储数据的字典</param>
        /// <param name="entityToIdMap">实体到ID的映射表</param>
        public override void Save(ValuesDictionary valuesDictionary, EntityToIdMap entityToIdMap)
        {
            valuesDictionary.SetValue<float>("Water", this.Water);
        }

        /// <summary>
        /// 更新饮水值逻辑
        /// 处理饮水的自然消耗、不同行为的额外消耗，以及缺水状态提示
        /// </summary>
        public void UpdateWater()
        {
            float gameTimeDelta = this.m_subsystemTime.GameTimeDelta;
            // 获取当前游戏模式
            GameMode arg_1C_0 = this.m_subsystemGameInfo.WorldSettings.GameMode;

            // 仅当启用生存模式机制时才计算饮水消耗
            if (this.m_subsystemGameInfo.WorldSettings.AreAdventureSurvivalMechanicsEnabled)
            {
                // 获取玩家的温度系数（影响饮水消耗速率，高温时消耗更快）
                float currentTemp = this.m_componentVitalStats.Temperature;
                // 基础饮水消耗（随时间自然减少）
                this.Water -= currentTemp * gameTimeDelta / 1850f;
                // 移动时的额外消耗（基于移动速度，移动越快消耗越多）
                this.Water -= currentTemp * gameTimeDelta * (this.m_componentPlayer.ComponentLocomotion.LastWalkOrder.HasValue ? this.m_componentPlayer.ComponentLocomotion.LastWalkOrder.Value.Length() : 0f) / 2440f;
                // 跳跃时的额外消耗（每次跳跃消耗固定值）
                this.Water -= currentTemp * this.m_componentPlayer.ComponentLocomotion.LastJumpOrder / 1200f;
                // 挖掘时的额外消耗（挖掘时持续消耗）
                if (this.m_componentPlayer.ComponentMiner.DigCellFace.HasValue)
                {
                    this.Water -= currentTemp * gameTimeDelta / 2880f;
                }

                // 若玩家未处于睡眠状态
                if (!this.m_componentPlayer.ComponentSleep.IsSleeping)
                {
                    // 当饮水值耗尽（≤0）时，触发缺水惩罚
                    if (this.Water <= 0f)
                    {
                        // 每0.5秒触发一次惩罚
                        if (this.m_subsystemTime.PeriodicGameTimeEvent(0.5, 0.0))
                        {
                            this.m_componentPlayer.ComponentHealth.Injure(0.05f, null, false, LanguageControl.Get(fName, 1));
                            // 减少耐力
                            ComponentVitalStats expr_17B = m_componentPlayer.ComponentVitalStats;
                            expr_17B.Stamina = expr_17B.Stamina - 0.1f;
                            // 若非创造模式，减少睡眠值
                            //if (m_subsystemGameInfo.WorldSettings.GameMode != Survival)
                            //{
                            //    ComponentVitalStats expr_1AA = this.m_componentPlayer.ComponentVitalStats;
                            //    expr_1AA.Sleep = expr_1AA.Sleep - 0.005f;
                            //}
                            // 减少湿润度
                            ComponentVitalStats expr_1C6 = this.m_componentPlayer.ComponentVitalStats;
                            expr_1C6.Wetness = expr_1C6.Wetness - 0.2f;
                        }
                    }
                    // 当饮水值从≥0.25降至<0.25时（严重缺水提示）
                    else if (this.Water < 0.25f && this.m_lastWater >= 0.25f)
                    {
                        this.m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 4), Color.Red, true, true);
                    }
                    // 当饮水值从≥0.5降至<0.5时（中度缺水提示）
                    else if (this.Water < 0.5f && this.m_lastWater >= 0.5f)
                    {
                        this.m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 3), Color.White, true, true);
                    }
                    // 当饮水值从≥0.85降至<0.85时（轻微缺水提示）
                    else if (this.Water < 0.85f && this.m_lastWater >= 0.85f)
                    {
                        this.m_componentPlayer.ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 2), Color.White, true, true);
                    }
                }
            }
            else
            {
                // 若未启用生存模式，饮水值固定为0.95（接近满值）
                this.Water = 0.95f;
            }
            this.m_lastWater = this.Water;
        }

        public SubsystemGameInfo m_subsystemGameInfo;
        public SubsystemTime m_subsystemTime;
        public ComponentPlayer m_componentPlayer;
        public SubsystemAudio m_subsystemAudio;
        public ComponentCreature m_componentCreature;
        public ComponentVitalStats m_componentVitalStats;
        // 内部存储的饮水值（通过Water属性访问和修改）
        public float m_water;
        // 上一帧的饮水值（用于检测状态变化）
        public float m_lastWater;
        // 本地化文本的键名（用于多语言支持）
        public static string fName = "ComponentWaterDrinking";
    }
}
